#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,p[N],b[N],ans[N];
vector<int> g[N];
struct hxtree{ //树状数组
	int v[N];
	int flow(int x){
		return x&-x;
	}
	void fix(int x,int y){
		for(;x<=n;x+=flow(x))
			v[x]+=y;
	}
	int fsum(int x){
		int ret=0;
		for(;x;x-=flow(x))
			ret+=v[x];
		return ret;
	}
}hx;
void dfs(int x){//x为节点，p[]为离散化后的数组
	//hx为值域树状数组
	ans[x]=-(hx.fsum(n)-hx.fsum(p[x]));//原来比x强的
	for(auto i:g[x]) dfs(i);     //加x的下属
	ans[x]+=(hx.fsum(n)-hx.fsum(p[x]));//后来比x强的
	hx.fix(p[x],1); //加x自己
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",p+i),b[i]=p[i];
	sort(b+1,b+n+1); //对萌新很友好的两步离散化
	for(int i=1;i<=n;i++)
		p[i]=lower_bound(b+1,b+n+1,p[i])-b;
	// for(int i=1;i<=n;i++)
	// 	printf("%d%c",p[i]," \n"[i==n]);
	for(int i=2;i<=n;i++){
		int fa;
		scanf("%d",&fa);
		g[fa].push_back(i);
	}
	dfs(1);
	for(int i=1;i<=n;i++)
		printf("%d\n",ans[i]); //1+1=2
	return 0;
}